home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Collection of Tools & Utilities
/
Collection of Tools and Utilities.iso
/
dskut
/
2m21src.zip
/
2MFBOOT.ASM
< prev
next >
Wrap
Assembly Source File
|
1994-05-31
|
64KB
|
1,492 lines
;┌───────────────────────────────────────────────────────────────────┐
;│ │
;│ █████ █ █ █▀▀▀▀ █▀▀▄ ▄▀▀▀▄ ▄▀▀▀▄ ▀▀█▀▀ │
;│ █ ██ ██ █ █ █ █ █ █ █ █ │
;│ █████ █ █ █ █▀▀ █▀▀█ █ █ █ █ █ │
;│ █ █ █ █ █ █ █ █ █ █ █ │
;│ █████ █ █ █ █▄▄▀ ▀▄▄▄▀ ▀▄▄▄▀ █ │
;│ │
;│ 2MFBOOT 2.1 - (C) Mayo 1994 Ciriaco García de Celis. │
;│ │
;│ CODIGO 2M PARA ARRANQUE FRIO DESDE DISQUETE. │
;│ │
;│ Proceso: │
;│ │
;│ TASM 2MFBOOT /m5 │
;│ TLINK 2MFBOOT │
;│ EXE2BIN 2MFBOOT.EXE 2MFBOOT.BIN │
;│ │
;│ El fichero .BIN hay que convertirlo a .DB con 2MFBMAKE.BAS │
;│ Es necesario que este fichero ocupe exactamente 2560 bytes │
;│ │
;└───────────────────────────────────────────────────────────────────┘
.286 ; versión para AT o superior
; ------------ Macros de propósito general.
XPUSH MACRO regmem ; apilar lista de registros
IRP rm, <regmem>
PUSH rm
ENDM
ENDM
XPOP MACRO regmem ; desapilar lista de registros
IRP rm, <regmem>
POP rm
ENDM
ENDM
DELAY MACRO ; estados de espera
JMP SHORT $+2 ; para AT obsoleto
JMP SHORT $+2
ENDM
PMICRO MACRO
CALL pmicro_iter ; realmente es una subrutina
ENDM
; ------------ Estructura de datos con información para cada unidad.
info_drv STRUC
maxs EQU 13 ; máximo 13 sectores físicos/pista
tipo_drv DB ? ; tipo de la disquetera (0 = no hay)
control2m_flag DB OFF ; a ON si 2M controla la unidad
cambio DB ON ; a ON indica cambio de soporte
version_fmt DB ? ; versión del formato de disco 2M
multi_io DB ? ; a 0 si posible acceso multi-sector
chk DB ? ; a 0 si checksum del sector 0 Ok
vunidad EQU THIS WORD
vunidad0 DB ? ; velocidad pista 0
vunidadx DB ? ; velocidad demás pistas
gap DB ? ; GAP entre sectores (leer/escribir)
sectpista DB ? ; sectores lógicos por pista
tabla_tsect DB maxs DUP (?) ; tamaños de sectores 1, 2, ..., N
tam_fat DB ? ; sectores/FAT en la unidad
ENDS
; ------------ Programa.
_PRINCIPAL SEGMENT
ASSUME CS:_PRINCIPAL, DS:_PRINCIPAL
ORG 0 ; código binario puro
; ****************************************
; * *
; * D A T O S R E S I D E N T E S *
; * *
; ****************************************
; ------------ Variables del programa (justo al principio).
info_ptr DW info_A ; punteros a datos de las unidades
DW info_B
DB "21" ; Versión 2MFBOOT 2.1
id_sistema DB "2M-STV" ; identificación de disco 2M
unidad DB ? ; unidad física de disco en curso
numsect DW ? ; sectores a transferir
sectini DW ? ; primer sector DOS a transferir
cilindro DB ? ; cilindro del disco a acceder
cabezal DB ? ; cabezal a emplear
sector DB ? ; número de sector físico
sector_ini DB ? ; número de sector físico inicial
sector_fin DB ? ; número de sector físico final
seccion DB ? ; parte del sector físico en curso
secciones DB ? ; sectores lógicos a transferir
tsector DB ? ; LOG2 (tamaño de sector) - 7
buffer DW buffer_io ; puntero al buffer intermedio
buf_unidad DB ? ; unidad del sector en el buffer
buf_cilcab DW ? ; cilindro/cabezal de sector buffer
buf_sector DB ? ; número de sector en el buffer
status DB ? ; resultado de los accesos a disco
fdc_result DB 7 DUP (?) ; bytes de resultados del FDC
orden DB ? ; operación F_READ/F_WRITE/F_VERIFY
tab_ordenes DB F_READ
DB F_WRITE
DB F_VERIFY ; órdenes 2, 3 y 4
; --- Interpretación BIOS de los bits de ST1
lista_errs DB 4 ; 'sector not found'
DB 0
DB 10h ; 'bad CRC'
DB 8 ; 'DMA overrun'
DB 0
DB 4 ; 'sector not found'
DB 3 ; 'write-protect error'
DB 2 ; 'address mark not found'
DB 20h ; en otro caso: 'bad NEC'
info_A info_drv <> ; datos de A:
info_B info_drv <> ; datos de B:
; ***************************************
; * *
; * C O D I G O R E S I D E N T E *
; * *
; ***************************************
; ------------ Nueva rutina de gestión de INT 13h. Llama a la INT 13h
; original o a una nueva rutina de control para la
; lectura (AH=2), escritura (AH=3) y verificación (AH=4)
; según el tipo de disco introducido.
ges_int13 PROC FAR
STI
CLD
PUSHF
PUSH SI
CMP DL,2
JAE ges13bios ; no es disquetera A: ó B:
CALL set_SI_drv
CMP CS:[SI].tipo_drv,2 ; ¿unidad 1.2M?
JE ges_2m
CMP CS:[SI].tipo_drv,4 ; ¿unidad 1.44/2.88M?
ges_2m: JC ges13bios ; no es unidad de alta densidad
CMP AH,2
JB ges13bios ; no Read/Write/Verify/Format
CMP AH,5
JA ges13bios ; no Read/Write/Verify/Format
JNE no_format
CALL set_flag_STV ; CF = 0 -> "disco no 2M"
JMP ges13bios
no_format: CALL detecta_cambio ; ¿cambio de disco?
JNC dilucida
POP SI
POPF
STC ; hubo cambio:
MOV AX,600h
RET 2 ; retornar con error
dilucida: CMP CS:[SI].control2m_flag,OFF
JE ges13bios ; la unidad la controla la BIOS
POP SI
POPF
CALL control2m ; la controla 2M
RET 2
ges13bios: POP SI
POPF
JMP CS:ant_int13 ; saltar al gestor de INT 13h
ges_int13 ENDP
; ------------ A la entrada en DL se indica la unidad y a la salida se
; devuelve SI apuntando sus variables sin alterar flags.
set_SI_drv PROC
PUSHF
PUSH BX
MOV BL,DL
MOV BH,0
SHL BX,1